
package com.b1.taskmanagerclient.start.gui;

import com.b1.taskmanagerclient.connect.Client;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

/**
 * Класс отрисовки окна контактов программы
 * обеспечивает работу пользователя
 * с контактами.
 * 
 * @extends JFrame
 */
public class ShowContact extends JFrame
{
    private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(ShowContact.class);
    private JButton button;                 // кнопки на форме
    private JPanel panel;                   // панель формы
    private JTable table;                   // таблица с контактами
    private DefaultTableModel modelTable;   // модель таблицы
    private JScrollPane scroll;             // прокрутка для таблицы
    private JLabel label = new JLabel();    // лейбл для хранения выбраного id контакта
    private String[][] contactArray;        // массив контактов
    private Client client;                  // клиентское подключение к серверу
    private JFrame window;                  // обьект текущего окна
    
    /**
     * метод возврата модели таблицы с данными
     * @return 
     */
    public TableModel getTableModel()
    {
        return modelTable;
    }
    /**
     * присвоение модели таблицы
     * @param tm 
     */
    public void setTableModel(TableModel tm)
    {
        table.setModel(tm);
    }
    
    /**
     * конструктор класса
     * отрисовывает интерфейс окна
     * использует уже установленное соединение
     * @param inClient 
     */
    public ShowContact(Client inClient) 
    {
        super("Contact List");
        panel = new JPanel();
        panel.setLayout(null);
        this.client = inClient;
        contactArray = client.getContactList();
        
        this.setSize(602, 200);
        try 
        {
            java.awt.Toolkit jToolkit = java.awt.Toolkit.getDefaultToolkit();
            java.awt.Dimension screenSize = jToolkit.getScreenSize();
            this.setLocation((int) (screenSize.getWidth() / 4), (int) (screenSize.getHeight() / 4));
        } 
        catch (java.awt.AWTError ex) 
        {
            log.error(ShowContact.class.getName(), ex);
        }
        table = new JTable();
        final String columnNames[] = {"id", "First Name", "Last Name", "Phone"};
        modelTable = new DefaultTableModel(contactArray, columnNames);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.addWindowListener(new java.awt.event.WindowAdapter() 
        {
            /*
             * слушатель для окна когда оно становиться активным
             * перерисовывает данные в таблицe
             */
            public void windowActivated(java.awt.event.WindowEvent e)
            {
                modelTable.setDataVector(client.getContactList(), columnNames);
            }
        });
        
        
        modelTable = new DefaultTableModel(contactArray, columnNames);
        table = new JTable(modelTable);
        modelTable.addTableModelListener(table);
        ListSelectionModel selModel = table.getSelectionModel();
        selModel.addListSelectionListener(new ShowContact.tableSelectionEvent());
        scroll = new JScrollPane(table);
        scroll.setSize(600, 100);
        scroll.setLocation(0, 0);
        table.setPreferredScrollableViewportSize(new java.awt.Dimension(600, 100));
        panel.add(scroll);
        
        button = new JButton("Add Contact");
        button.setSize(120, 40);
        button.setLocation(120, 120);
        button.addActionListener(new ShowContact.ButtonEventListenerAddContact());
        panel.add(button);

        button = new JButton("Delete Contact");
        button.setSize(120, 40);
        button.setLocation(250, 120);
        button.addActionListener(new ShowContact.ButtonEventListenerDelContact());
        panel.add(button);

        button = new JButton("Change Contact");
        button.setSize(125, 40);
        button.setLocation(380, 120);
        button.addActionListener(new ShowContact.ButtonEventListenerChangeContact());
        panel.add(button);

        this.setContentPane(panel);
        window = this;
    }
    
    /**
     * слушатель события клик, на кнопке Add Contact
     * открывает новое окно для добавления contact
     * @implements ActionListener
     */
    class ButtonEventListenerAddContact implements ActionListener 
    {

        public void actionPerformed(ActionEvent e) 
        {
            AddWindow app = new AddWindow(1,client,window);
            app.setVisible(true);
            setVisible(false);
        }
    }
    
    /**
     * слушатель события клик, на кнопке Delete Client
     * выдает сообщение о подверждении удаления выбраного Client.
     * удаляет выбраный Client из списка и передает его id
     */
    class ButtonEventListenerDelContact implements ActionListener 
    {
        public void actionPerformed(ActionEvent e) 
        {
            if(label.getText().equals("")) JOptionPane.showMessageDialog(null,"don't select ", "Output",JOptionPane.PLAIN_MESSAGE);
            else 
            {
                Object[] options = { "Yes", "No" };
                int n = JOptionPane.showOptionDialog(null, "Delete this contact?",
                        "Confirmation", JOptionPane.YES_NO_OPTION,
                        JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
                if (n == 0) 
                {
                    String temp[][] = new String[contactArray.length - 1][8];
                    int sel = table.getSelectedRow();
                    int j = 0;
                    for (int i = 0; i < contactArray.length; i++)
                    {
                        if (i == sel) continue;
                        temp[j++] = contactArray[i];
                    }
                    contactArray = temp;
                    modelTable.removeRow(sel);
                    table.setModel(modelTable);
                    client.setContactList(contactArray);
                }
            }
        } 
    }
    
    /**
     * слушатель события клик, на кнопке Change contact
     * открывает окно для изменения выбранного contact.
     * Передает id contact в метод изменения contact класса ChangeWindow     *
     */
    class ButtonEventListenerChangeContact implements ActionListener 
    {

        public void actionPerformed(ActionEvent e) 
        {
            if(label.getText().equals("")) JOptionPane.showMessageDialog(null,"don't select ", "Output",JOptionPane.PLAIN_MESSAGE);
            else 
            {
                ChangeWindow chw= new ChangeWindow(1,table.getSelectedRow(),client,window);
                chw.setVisible(true);
                setVisible(false);
            }
        }
    }
    /**
     * слушатель события клик, на записи таблицы Client
     * определяет id выбранного client из таблицы
     */
    class tableSelectionEvent implements ListSelectionListener
    {
            public void valueChanged(ListSelectionEvent e) 
            {
                String result = "";
                int[] selectedRows = table.getSelectedRows();
                for(int i = 0; i < selectedRows.length; i++) 
                {
                    result += table.getModel().getValueAt(selectedRows[i], 0);
                }
                label.setText(result);
                label.setVisible(false);
                panel.add(label);
            }
    }
}
